package com.ruoyi.common.utils;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class PasswordUtil {
    // 定义字符集
    private static final String UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final String LOWER_CASE = "abcdefghijklmnopqrstuvwxyz";
    private static final String DIGITS = "0123456789";
    private static final String SPECIAL_CHARS = "!@#$%^&*()_+-=[]{}|;:,.<>?";

    private static final SecureRandom random = new SecureRandom();

    /**
     * 生成随机密码
     *
     * @param length 密码长度
     * @param includeSpecial 是否包含特殊字符
     * @return 生成的密码
     */
    public static String generatePassword(int length, boolean includeSpecial) {
        if (length < 4) {
            throw new IllegalArgumentException("密码长度不能少于4位");
        }

        StringBuilder password = new StringBuilder();
        List<Character> charList = new ArrayList<>();

        // 确保每种类型至少有一个字符
        // 1. 至少一个大写字母
        charList.add(UPPER_CASE.charAt(random.nextInt(UPPER_CASE.length())));

        // 2. 至少一个小写字母
        charList.add(LOWER_CASE.charAt(random.nextInt(LOWER_CASE.length())));

        // 3. 至少一个数字
        charList.add(DIGITS.charAt(random.nextInt(DIGITS.length())));

        // 4. 如果包含特殊字符，至少一个特殊字符
        if (includeSpecial) {
            charList.add(SPECIAL_CHARS.charAt(random.nextInt(SPECIAL_CHARS.length())));
        }

        // 构建完整的字符集
        String allChars = UPPER_CASE + LOWER_CASE + DIGITS;
        if (includeSpecial) {
            allChars += SPECIAL_CHARS;
        }

        // 填充剩余长度
        int remainingLength = length - charList.size();
        for (int i = 0; i < remainingLength; i++) {
            charList.add(allChars.charAt(random.nextInt(allChars.length())));
        }

        // 随机打乱顺序
        Collections.shuffle(charList, random);

        // 构建最终密码
        for (char c : charList) {
            password.append(c);
        }

        return password.toString();
    }

    /**
     * 生成默认密码（8位，包含大小写字母和数字）
     *
     * @return 生成的密码
     */
    public static String generateDefaultPassword() {
        return generatePassword(8, false);
    }

    /**
     * 生成强密码（12位，包含大小写字母、数字和特殊字符）
     *
     * @return 生成的密码
     */
    public String generateStrongPassword() {
        return generatePassword(12, true);
    }

    /**
     * 生成类似 ZDJreBm9 格式的密码（8位，2大写+4小写+2数字）
     *
     * @return 生成的密码
     */
    public String generateStandardPassword() {
        return generatePatternPassword(2, 4, 2, 0);
    }

    /**
     * 按模式生成密码
     *
     * @param upperCount 大写字母数量
     * @param lowerCount 小写字母数量
     * @param digitCount 数字数量
     * @param specialCount 特殊字符数量
     * @return 生成的密码
     */
    public String generatePatternPassword(int upperCount, int lowerCount, int digitCount, int specialCount) {
        List<Character> charList = new ArrayList<>();

        // 添加大写字母
        for (int i = 0; i < upperCount; i++) {
            charList.add(UPPER_CASE.charAt(random.nextInt(UPPER_CASE.length())));
        }

        // 添加小写字母
        for (int i = 0; i < lowerCount; i++) {
            charList.add(LOWER_CASE.charAt(random.nextInt(LOWER_CASE.length())));
        }

        // 添加数字
        for (int i = 0; i < digitCount; i++) {
            charList.add(DIGITS.charAt(random.nextInt(DIGITS.length())));
        }

        // 添加特殊字符
        for (int i = 0; i < specialCount; i++) {
            charList.add(SPECIAL_CHARS.charAt(random.nextInt(SPECIAL_CHARS.length())));
        }

        // 随机打乱顺序
        Collections.shuffle(charList, random);

        StringBuilder password = new StringBuilder();
        for (char c : charList) {
            password.append(c);
        }

        return password.toString();
    }


}